1. Field of the Invention
The present invention relates generally to microprocessor design and, in particular, but not by way of limitation, to memory use procedures during initial booting of computer systems.
2. Background of the Invention and Related Art
When a PC is powered up, generally a process called power-on self-test (POST), or a similar type booting process, is initiated. POST begins with an electrical signal being transmitted on a permanently programmed path to the microprocessor. This electrical signal results in the clearing of any left over data from the microprocessor""s internal memory registers. Moreover, the signal also resets a microprocessor register containing the program counter to a specific number.
This number stored in the program counter tells the microprocessor the address of the next instruction that needs processing. For example, the address may be the beginning of a boot program stored permanently in a set of read-only memory (ROM) chips that contain the computer""s basic input/output system (BIOS). The CPU, thus, can use the address from the program counter to find and invoke the BIOS boot program, which in turn invokes a series of system checks. The problem, however, arises in writing the code for this BIOS boot program.
In conventional computer systems, writing the code for the BIOS is difficult because of the lack of memory resources when the computer is being booted. Traditional memory, for example, cannot be used while the computer is being booted because it has not yet been initialized. Accordingly, the only available memory that BIOS coders could traditionally use is the general purpose registers actually contained inside the microprocessor. However, the number of these general purpose registers is generally limited. For example, typical Pentium(copyright) and Pentium(copyright)-type microprocessors only contain 8 general purpose registers. One skilled in the art, however, can readily recognize that the present invention can be adapted to virtually any type of modern microprocessor with virtually any number of general purpose registers.
With so few general purpose registers inside the microprocessor, however, writing the code for the BIOS becomes difficult. In particular, writing the code in a modular format, which normally requires a stack interface, becomes extremely difficult. In fact, conventional, prior-art BIOS code does not use the xe2x80x9ccallxe2x80x9d and xe2x80x9creturnxe2x80x9d functions normally used by modular code. Instead, conventional BIOS programming uses a jump interface. That is, the code contains instructions to jump to a particular routine and at the end of that routine to jump back to a particular place in the BIOS code.
As one skilled in the art can recognize, to properly utilize such a jump interface, the present address of the BIOS instruction being executed must be recorded prior to jumping to a new instruction in the BIOS code. This address of the currently executed BIOS instruction serves as the return address once the section of code jumped to has finished execution.
For the BIOS code to function properly, this return address must be stored in an incorruptible location. In the conventional computer system, for example, this return address is stored in one of the general purpose registers contained inside the microprocessor. However, because the BIOS program would become lost without this return address, it is important that the BIOS programmer not overwrite the general purpose register that contains the return address. Although not overwriting the return address is relatively simple for a single jump routine, the difficulty in not overwriting the return address becomes exponentially more difficult when nested routines or nested jumps are used. Because nested routines/jumps are generally needed throughout BIOS code, writing BIOS code using only the microprocessor""s general purpose registers results in code that is excessively long and difficult to debug. Accordingly, a method and apparatus are needed to address the above-mentioned and other problems with conventional computer systems.
To remedy the deficiencies of existing systems and methods, the present invention provides a method and apparatus to provide additional data storage resources during booting procedures. For example, one embodiment of the present invention includes a mass storage device for storing computer programs; a microprocessor connected to the mass storage device, wherein the microprocessor includes an execution unit; a general purpose register for storing a first data element; an MMX unit including a plurality of MMX registers, which are configurable to act as a virtual stack in addition to their intended purpose. This embodiment further includes a storage device for storing BIOS instructions; and a plurality of BIOS instructions stored on the storage device, that cause the microprocessor to execute a virtual stack push instruction wherein the first data element is moved from the general purpose register to a first of the plurality of MMX registers; and to execute a virtual stack pop instruction wherein the first data element previously moved from the general purpose register to the first of the plurality of MMX registers is moved from the first of the plurality of MMX registers to the general purpose register; wherein the virtual stack push instruction and the virtual stack pop instruction are executable prior to initialization of a main memory.